/* "qDroid v.2009.04.27 pre-alfa-2"
 * qdl_TcpServer.h
 *
 *  Created on: 18.05.2009
 *      Author: Denjs
 *
 * !!!!  QT += network 
 */
// UTF-8 !!!

#ifndef QDL_TCPSERVER_H_
#define QDL_TCPSERVER_H_

#include <QtCore>
#include <QtScript>
#include <QtNetwork> 

//#include "qdl_TcpSocket.h"
class qdl_TcpSocket;
#include "classes/bots/qdl_TcpSocket.h"


//class qdl_TcpSocket;
//#include "classes/bots/qdl_TcpSocket.h"


/*:: [[@TcpServer]] 
[[:QDroid_classes]] 

**TcpServer** - класс предоставляющй функциональность tcp-сервера. \n 

См также: 
  * [[TcpSocket]] (экземпляр генерируется при появлении клиентского подключения);


Общие характеристики:
  * имя конструктора QtScript: TcpServer ;
  * C++ имя класса : qdl_TcpServer наследован от QTcpServer ; 
  * Является "оболочкой" для C++\QT класса QTcpServer ;
  * Являетля классом расширения. имя расширения : [[qdlib_tcpserver]]
  * Требует для нормальной работы загруженного расширения : [[qdlib_bytearray]] 

*/
class qdl_TcpServer :public QTcpServer
{
    Q_OBJECT

public:
	qdl_TcpServer();
	virtual ~qdl_TcpServer();

    	//это (ниже) нужно что бы можно было засунуть класс в контейнер QList
    	// возможно так-же связано с работой QtScript движка - см функции
		// после определения класса
		//
    	// спец. настройки для QtScript (v 2008.11.25)
    	// Шаг 1 из 8
    	qdl_TcpServer(const qdl_TcpServer &other);

    	//это (ниже) нужно что бы можно было засунуть t_FileList в контейнер QList
    	// возможно так-же связано с работой QtScript движка - см функции
    	// после определения класса
    	//
    	// спец. настройки для QtScript (v 2008.11.25)
    	// Шаг 2 из 8
    	qdl_TcpServer& operator=(const qdl_TcpServer &other);


    	// спец. настройки для QtScript (v 2008.11.25)
    	// Шаг 2.2 из 8
		bool operator==(const qdl_TcpServer &other ) const;


public slots:
	QString GetId();
	
		// listed below functions 
  // are just re-declarations of old functions as slots 
  // for have ability to use it in qt-script
  
  // also maybe needs for declaring: 
  //        QNetworkProxy ???? in future reliases maybe
    void close () ;
    QString errorString () const ;
    //virtual 
    bool hasPendingConnections () const; 
    bool isListening () const ;
/*replaced *///        //     bool listen ( const QHostAddress & address = QHostAddress::Any, quint16 port = 0 );
/*REPLACE*/ bool listen( QString address, quint16 port = 0 );
/*REPLACE*/ bool listen( quint16 port = 0 );
    int maxPendingConnections () const; 
    //virtual 
    //QTcpSocket* nextPendingConnection (); //будет конвертироваться в qdl_TcpSocket в функциях преобразования сокета

    //так потому, что мы не можем(?) переопределить в потомке функцию на другой тип, который нельзя привести к изначальному.
    qdl_TcpSocket *nextPendingConnection_qd(); //ссылка на оболочку !
/*does not needs now ?*///    QNetworkProxy proxy () const;
/*does not needs now ?*///    QHostAddress serverAddress () const;
/*REPLACE*/ QString serverAddress () const;
/*replaced */           //    QAbstractSocket::SocketError serverError () const; //enum QAbstractSocket::SocketError 
/*REPLACE*/ int serverError () const; //enum QAbstractSocket::SocketError 
    quint16 serverPort () const ;
    void setMaxPendingConnections ( int numConnections ); 
/*does not needs now ?*///     void setProxy ( const QNetworkProxy & networkProxy ) ;
    bool setSocketDescriptor ( int socketDescriptor ) ;
    int socketDescriptor () const ;
    bool waitForNewConnection ( int msec = 0, bool * timedOut = 0 );  

};

//----------------------------------------------------------------------
//нужно чтобы можно было передавать эти элементы как параметры в функции внутри QtScript
// спец. настройки для QtScript (v 2008.11.25)
// Шаг 3 из 8
Q_DECLARE_METATYPE(qdl_TcpServer*);

// спец. настройки для QtScript (v 2008.11.25)
// Шаг 4 из 8
static QScriptValue f_qdroid_qdl_TcpServer_toScriptValue(QScriptEngine *engine, qdl_TcpServer* const &in)
{ return engine->newQObject(in); }

// спец. настройки для QtScript (v 2008.11.25)
// Шаг 5 из 8
static void f_qdroid_qdl_TcpServer_fromScriptValue(const QScriptValue &object, qdl_TcpServer* &out)
{ out = qobject_cast<qdl_TcpServer*>(object.toQObject()); }

// спец. настройки для QtScript (v 2008.11.25)
// Шаг 6 из 8
//конструктор для последующего его определения как new в скрипте
static QScriptValue f_qdroid_qdl_TcpServer_constructor(QScriptContext *QSContext, QScriptEngine *QSEngine)
	{
		//t_BaseBot BaseBot;
		QScriptValue QtSObject;
		QtSObject=QSEngine->newQObject(new qdl_TcpServer()); //
		return QtSObject;
	}

// шаги 7 и 8 должны быть выполнены в программе которая собирается использовать данный класс совместно со скриптовым движком
//// спец. настройки для QtScript (v 2008.11.25)
//// Шаг 7 из 8
//// - это qScriptRegisterMetaType регистрация но это нужно сделать в головном классе
//// например в глобальной функции "define__qdroid_qtscript_functions()"
////// t_FileList TYPE defenition
//	qScriptRegisterMetaType(_QSEngine, f_qdroid_qdl_TcpServer_toScriptValue, f_qdroid_qdl_TcpServer_fromScriptValue);

//// спец. настройки для QtScript (v 2008.11.25)
//// Шаг 8 из 8
////- определение конструктора в контексте скрипта
////// t_FileList NEW constructor defenition
//	QScriptValue fun5_constr = _QSEngine->newFunction(f_qdroid_qdl_TcpServer_constructor);
//	_QSEngine->globalObject().setProperty("qdl_TcpServer", fun5_constr);

static int f_qdroid_qdl_TcpServer_register(QScriptEngine *_QSEngine)
	{
		//шаг 7 регистрация метатипа
		qScriptRegisterMetaType(_QSEngine, f_qdroid_qdl_TcpServer_toScriptValue, f_qdroid_qdl_TcpServer_fromScriptValue);
		//шаг 8 регистрация конструктора
		_QSEngine->globalObject().setProperty("TcpServer", _QSEngine->newFunction(f_qdroid_qdl_TcpServer_constructor));
		return 0;
	}
//----------------------------------------------------------------------

#endif /* QDL_TCPSERVER_H_ */
